home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / utility / winmode.zip / WINMODE.C < prev    next >
Text File  |  1992-02-26  |  3KB  |  88 lines

  1.  
  2. // WinMode 1.0 for Windows 3.1
  3. // Copyright (c) 1988-92 Finnegan O'Malley & Company Inc.
  4. // All Rights Reserved.
  5. // First Published in PC Magazine, May 12, 1992.
  6.  
  7. // developed under Microsoft C 5.1
  8.  
  9. #include <dos.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12.  
  13. #define INT_MULTIPLEX   0x2F
  14.  
  15. #define MODE_DOS                        0
  16. #define MODE_DOS_TASK_SWITCHER          1       // TS
  17. #define MODE_WINDOWS_3_XX_STANDARD      2       // TS
  18. #define MODE_WINDOWS_386_2_XX           3       // VM
  19. #define MODE_WINDOWS_X_XX_386_ENHANCED  4       // VM
  20.  
  21. extern  int             main(int argc, char **argv);
  22.  
  23. ////////////////////////////////////////////////////////
  24.  
  25. extern  int             main(int argc, char **argv)
  26. {
  27. auto    struct   SREGS  Seg;  // segment registers
  28.  
  29. static  union    REGS   Reg;  // general registers
  30.  
  31. if (argc != 1)
  32.     printf("%s 1.0 for Windows 3.1\n"
  33.             "Copyright (c) 1988-92 Finnegan O'Malley"
  34.             " & Company Inc.  All Rights Reserved.\n"
  35.             "First Published in PC Magazine,"
  36.             " May 12, 1992.\n\n", argv[0]);
  37.  
  38. segread(&Seg);  // initialize the segment registers
  39.  
  40. Reg.x.ax = 0x1600;      // in 386 Enhanced mode?
  41. int86x(INT_MULTIPLEX, &Reg, &Reg, &Seg);
  42. switch (Reg.h.al)
  43.     {
  44.     case 0x00:  // not in 386 Enhanced mode
  45.     case 0x80:  // not in 386 Enhanced mode
  46.         break;
  47.  
  48.     case 0x01:  // Windows/386 2.xx is running
  49.     case 0xFF:  // Windows/386 2.xx is running
  50.         printf("Windows/386 2.xx is running (%d)\n",
  51.                 MODE_WINDOWS_386_2_XX);
  52.         return  MODE_WINDOWS_386_2_XX;
  53.  
  54.     default:    // in 386 Enhanced mode, where:
  55.                 //  AL: major version (3., 4., ...)
  56.                 //  AH: minor version (00, 10, ...)
  57.         printf("Windows %d.%02d is running in 386 Enhanced"
  58.                 " mode (%d)\n", Reg.h.al, Reg.h.ah,
  59.                 MODE_WINDOWS_X_XX_386_ENHANCED);
  60.         return  MODE_WINDOWS_X_XX_386_ENHANCED;
  61.     }
  62.  
  63. Reg.x.ax = 0x4680;      // in plain vanilla DOS mode?
  64. int86x(INT_MULTIPLEX, &Reg, &Reg, &Seg);
  65. if (Reg.h.al == 0x80)   // not in DOS Task Switcher,
  66.     {                   //  Real or Standard mode
  67.     printf("Windows is not running, nor is the DOS"
  68.             " Task Switcher (%d)\n",
  69.             MODE_DOS);
  70.     return  MODE_DOS;
  71.     }
  72.  
  73. if (getenv("windir")    // in Real or Standard mode?
  74. ||  getenv("WINDIR"))   // (in case it goes upper case)
  75.     {
  76.     printf("Windows 3.xx is running in Real or Standard"
  77.             " mode (%d)\n",
  78.             MODE_WINDOWS_3_XX_STANDARD);
  79.     return  MODE_WINDOWS_3_XX_STANDARD;
  80.     }
  81.  
  82. // otherwise, the DOS MS-DOS Shell is running
  83. printf("The DOS Task Switcher is running (%d)\n",
  84.         MODE_DOS_TASK_SWITCHER);
  85. return  MODE_DOS_TASK_SWITCHER;
  86. }
  87.  
  88.